// 加载模块
const express = require('express')
const Article = require('../db/models/articleModel')
// 生成路由实例
const router = express.Router()

/**
 * @api {post} /article/new 添加文章
 * @apiGroup article
 *
 * @apiParam {String} title 标题
 * @apiParam {String} content 内容
 * @apiParam {String} date 日期
 * @apiParam {Array} tag 标签
 * @apiParam {Array} comments 评论
 *
 * @apiSuccessExample 返回数据示例:
 * {
 *     "err": 0,
 *     "msg": "添加成功"
 * }
 */
router.post('/new', (req, res) => {
    let { title, content, date, tag, comments } = req.body
    // 对数据进行校验（空值，格式，长度等）
    if (!title || !content || !date) {
        return res.send({ err: -1, msg: '参数错误' })
    }
    // Article.find({"_id":id})
    // .then((data)=>{
    //     if (data.length>0) {
    //         res.send({err:-2,msg:'该数据已存在'})
    //     } else {
    //         return Article.insertMany({id,title,content,date,tag,comments})
    //     }
    // })
    // 事实上，这个接口调用的时候，一定不会有人想写一个id去标记自己的博客。这个是用来新建博客的。
    Article.insertMany({ title, content, date, tag, comments })
        .then(() => {
            res.send({ err: 0, msg: '添加成功' })
        })
        .catch((err) => {
            if (err) {
                res.send({ err: -4, msg: '执行出现异常' })
            }
        })
    // res.send('add ok')
})

/**
 * @api {post} /article/getId 通过mongodb自带的Id查询
 * @apiGroup article
 *
 * @apiParam {Number} Id Id
 *
 * @apiSuccessExample 返回数据示例:
 * {
 *     "err": 0,
 *     "msg": "查询成功",
 *     "data": [{...},{...}]
 * }
 */
router.post('/getId', (req, res) => {
    let { id } = req.body
    // 对数据进行校验（空值，格式，长度等）
    if (!id) {
        return res.send({ err: -1, msg: '参数错误' })
    }
    // 通过_id查询数据
    Article.find({ "_id": id })
        .then((data) => {
            if (data.length > 0) {
                res.send({ err: 0, msg: '查询成功', data: data })
            } else {
                res.send({ err: -1, msg: '暂无数据', data: [] })
            }
        })
        .catch((err) => {
            res.send({ err: -2, msg: '查询失败' })
        })
})

/**
 * @api {get} /article/getAll 直接获取全部数据
 * @apiGroup article
 *
 * @apiSuccessExample 返回数据示例:
 * {
 *     "err": 0,
 *     "msg": "查询成功",
 *     "data": [{...},{...}]
 * }
 */
router.get('/getAll', (req, res) => {
    Article.find()
        .then((data) => {
            if (data.length > 0) {
                res.send({ err: 0, msg: '查询成功', data: data })
            } else {
                res.send({ err: -1, msg: '暂无数据', data: [] })
            }
        })
        .catch((err) => {
            res.send({ err: -2, msg: '查询失败' })
        })
})

/**
 * @api {get} /article/getTag 拿到数据库所有数据的Tag,用于展示
 * @apiGroup article
 *
 * @apiParam {String}  Tag
 *
 * @apiSuccessExample 返回数据示例:
 * {
 *     "err": 0,
 *     "msg": "查询成功",
 *     "data": [{...},{...}]
 * }
 */
router.get('/getTag', (req, res) => {

    // 查询存在tag字段的数据
    Article.find({ tag: { $exists: true } })
        .then((data) => {
            // console.log(data)

            let TagList = new Set()
            //获取所有的tag
            for (let i = 0; i < data.length; i++) {
                let tmp = data[i].tag
                if (tmp) {
                    for (let j = 0; j < tmp.length; j++) {
                        TagList.add(tmp[j])
                    }
                }
            }
            let taglist = [...TagList]

            if (data.length > 0) {
                res.send({ err: 0, msg: '查询成功', taglist })
            }
            else {
                res.send({ err: -1, msg: '暂无数据', taglist })
            }
        })
        .catch((err) => {
            res.send({ err: -2, msg: '查询失败' })
        })
})

/**
 * @api {post} /article/search 关键字查询
 * @apiGroup article
 *
 * @apiParam {String} kw 关键字
 *
 * @apiSuccessExample 返回数据示例:
 * {
 *     "err": 0,
 *     "msg": "查询成功",
 *     "data": [{...},{...}]
 * }
 */
router.post('/search', (req, res) => {
    let { kw } = req.body
    let reg = new RegExp(kw)
    // 对数据进行校验（空值，格式，长度等）
    if (!kw) {
        return res.send({ err: -1, msg: '参数错误' })
    }

    // 查询数据
    Article.find({ $or: [{ title: { $regex: reg } }, { tag: { $in: kw } }] })
        .then((data) => {
            if (data.length > 0) {
                res.send({ err: 0, msg: '查询成功', data: data })
            } else {
                res.send({ err: -1, msg: '暂无数据', data: [] })
            }
        })
        .catch((err) => {
            res.send({ err: -2, msg: '查询失败' })
        })
})

/**
 * @api {post} /article/getPage 分页查询
 * @apiGroup article
 *
 * @apiParam {String} page 页码
 * @apiParam {String} size 每页数据条数
 *
 * @apiSuccessExample 返回数据示例:
 * {
 *     "err": 0,
 *     "msg": "查询成功",
 *     "data": [{...},{...}],
 *     "pages": 3,
 *     "count": 10
 * }
 */
router.post('/getPage', (req, res) => {
    let { page, size } = req.body
    page = page || 1 // 页码，默认第一页
    size = size || 4 // 每页条数，默认4条
    let pages = 0 // 数据总页数
    let count = 0 // 数据总条数
    // 查询数据
    Article.find()
        .then((data) => {
            count = data.length // 数据总条数
            pages = Math.ceil(count / size) // 数据总页数

            // 查询指定页码的数据
            return Article.find().limit(Number(size)).skip(Number((page - 1) * size))
        })
        .then((data) => {
            res.send({ err: 0, msg: '查询成功', data: data, pages: pages, count: count })
        })
        .catch((err) => {
            res.send({ err: -2, msg: '查询失败' })
        })
})

/**
 * @api {post} /article/update 修改文章
 * @apiGroup article
 *
 * @apiParam {Number} id 文章id // 这个id是根据已经渲染出的数据（带有mogodb的_id）得到的
 * @apiParam {String} title 标题
 * @apiParam {String} content 内容
 * @apiParam {String} date 日期
 * @apiParam {String} tag 标签
 *
 * @apiSuccessExample 返回数据示例:
 * {
 *     "err": 0,
 *     "msg": "修改成功"
 * }
 */
router.post('/update', (req, res) => {
    let { id, title, content, date, tag } = req.body
    // 对数据进行校验（空值，格式，长度等）
    if (!id) {
        return res.send({ err: -2, msg: '参数错误' })
    }

    // 修改数据
    Article.findByIdAndUpdate({ "_id": id }, { $set: { title, content, date, tag } })
        .then((data) => {
            res.send({ err: 0, msg: '修改成功' })
        })
        .catch((err) => {
            res.send({ err: -1, msg: '修改失败' })
        })
})



/**
 * @api {post} /article/del 删除文章
 * @apiGroup article
 *
 * @apiParam {Number} id 文章id
 *
 * @apiSuccessExample 返回数据示例:
 * {
 *     "err": 0,
 *     "msg": "删除成功"
 * }
 */
router.post('/del', (req, res) => {
    let { id } = req.body
    // 对数据进行校验（空值，格式，长度等）
    if (!id) {
        return res.send({ err: -1, msg: '参数错误' })
    }

    Article.find({ "_id": id })
        .then((data) => {
            if (data.length > 0) {
                // console.log('删除')
                return Article.deleteOne({ "_id": id })
            } else {
                res.send({ err: 4, msg: '查找失败' })
            }
        })
        .then(() => {
            res.send({ err: 0, msg: '删除成功' })
        })
        .catch((err) => {
            res.send({ err: -2, msg: '删除失败' })
        })
    // res.send('del ok')
})

module.exports = router
